「サーバーレスアーキテクチャへのChaos Engineeringの原則適用」のセッションで紹介されていたChaos Lambdaを試してみた #reinvent
こんにちは、shoitoです。
re:Invent 2018も終わり無事に日本に帰国しました。
今回はサーバーレスアーキテクチャへのChaos Engineeringの原則適用(DVC305)のセッション内で紹介されていたChaos Lambdaを試してみました。
セッションのスライドはこちらです。
なお、弊社阿部によるセッションレポートがこちらです。
[レポート]サーバーレスアーキテクチャへのChaos Engineeringの原則適用について #reinvent #DVC305
Chaos Lambdaって何?
Chaos Lambda - a lightweight serverless chaos monkey for AWS https://artillery.io/chaos-lambda/
Chaos LambdaはNetflixのChaos MonkeyのLambdaによるサーバレス実装であり、Artillery.ioにより開発されたOSSです。
簡単に紹介すると、EC2インスタンスやECSタスクで構成されたAWSベースシステムの可用性や耐障害性を実験するためのツールです。
CloudWatchイベントによりスケジューリングされたタイミングでEC2インスタンスのTerminateがランダムに実行されます。
もちろん、Terminate対象はタグやセキュリティグループで指定できますし、デフォルトでは全てが対象外なので、Lambdaファンクションのデプロイ自体は安心して行えます。
Chaos Lambdaを試してみる
- CLIツールをnpmでインストールします。
$ npm install -g chaos-lambda
- Lambdaファンクション用のIAMロールを作成します。このロールはEC2インスタンスのTerminateを実行するため
AmazonEC2FullAccess
ポリシーを付与します。 -
Chaos LambdaのLambdaファンクションをデプロイします。
$lambda-role-arn
の部分は2.で作成したロールのARNで置き換えてください。 またAWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1
というように環境変数でプロファイルとリージョンを指定可能です。 リージョンを指定しないとデフォルトのeu-west-1
として動きます。$ chaos-lambda deploy -r $lambda-role-arn
例として、以下のようなコマンドになります。
AWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1 chaos-lambda deploy -r arn:aws:iam::1234567890:role/chaos-lambda-role
正常にデプロイが終わると
chaos_lambda_config.json
が生成され、その中にLambdaファンクションとLambdaロールのARNが保存されています。$ cat chaos_lambda_config.json { "FunctionArn": "arn:aws:lambda:ap-northeast-1:1234567890:function:chaosLambda:8", "LambdaRoleArn": "arn:aws:iam::1234567890:role/chaos-lambda-role" }
- EC2インスタンスのTerminate頻度を
-c
オプションで指定する設定ファイルに記載します。 以下では、60分に1回Lambdaファンクションが実行されます。Terminate対象はchaos_monkey:true
のタグが設定されたEC2インスタンスです。$ cat Chaosfile.json { "interval": "60", "enableForTags": [ { "key": "chaos_monkey", "value": "true" } ] }
-c
オプションで設定ファイルを指定し、chaos-lambda deploy
コマンドを再度実施します。$ chaos-lambda deploy -c Chaosfile.json
例として、以下のようなコマンドになります。
AWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1 chaos-lambda deploy -c Chaosfile.json
これでデプロイは完了です。
デプロイ内容を確認してみましょう。
まずはLambdaファンクションです。chaosLambda
という名前で作られています。
CloudWatch Eventsルールですがchaos_lambda_schedule
という名前でChaosfile.json
の設定内容が反映され作られています。
最後に、Terminate対象のEC2インスタンスを用意します。
一つのインスタンスがランダムでTerminateされても、サービスを提供し続けられるようにAuto Scalingグループの設定をします。
Chaos Lambdaの対象とするため、このグループのインスタンスにはChaosfile.json
のenableForTags
で指定したchaos_monkey:true
のタグがEC2インスタンスの起動時に付与されるようにします。
しばらく様子を見ていると、Lambdaファンクションが実行され、EC2インスタンスがTerminateされ、Auto Scalingにより新たなインスタンスが起動する様子を伺えます。
Chaos Lambdaにより、EC2インスタンスがTerminateされていく様子
Auto Scalingにより。ECインスタンスが新たに作られる様子
Chaos Lambdaがサポートされるリージョン
- US East (Northern Virginia) - US West (Oregon) - Europe (Ireland) - Asia Pacific (Tokyo)
ライセンス
さいごに
Applying Principles of Chaos Engineering to Serverless (DVC305)のセッションで紹介されていたChaos Lambdaを紹介し、EC2インスタンスの2台構成の環境で試してみました。
EC2インスタンス以外にも、Chaos Engineeringの実験をすべきレイヤーは多々あるので、他のプラクティスやツールを今後追っていきます。